package com.zhongkai.service.impl;

import com.mysql.jdbc.StringUtils;
import com.zhongkai.Bean.BigDateBean;
import com.zhongkai.Bean.BigUnitBean;
import com.zhongkai.Bean.UnitControlBean;
import com.zhongkai.MessageTool;
import com.zhongkai.StringStatic;
import com.zhongkai.app.service.DeviceControlService;
import com.zhongkai.app.service.DeviceOperationService;
import com.zhongkai.app.service.IBaseDao;
import com.zhongkai.jedis.JedisClient;
import com.zhongkai.listener.RocketMqProducer;
import com.zhongkai.model.utils.ZhongkaiResult;
import com.zhongkai.model3.SetUnit;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


/**
 * web页面控制设备
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceControlServiceImpl implements DeviceControlService {

    @Autowired
    private IBaseDao iBaseDao;

    @Autowired
    private JedisClient jedisClient;

    //private LoginInterceptor loginInterceptor;

/*    @Autowired
    private JmsTemplate jmsTemplate;

    @Resource
    private Destination topicDestination;*/

/*    @Autowired
    private RedisUtils redisUtils;*/

    @Autowired
    private RocketMqProducer rocketMqProducer;

    @Autowired
    private DeviceOperationService deviceOperationService;


    private BigUnitBean bigUnitBean_json;

    private String con;


    /**
     * 通电吧 皮卡丘
     * 断电吧 皮卡丘
     * web页面控制设备
     *
     * @param device_id 设备uuid
     * @param is_switch 命令 1 开机  2关机 3 改变温度
     * @param parameter 非必传
     */
    @Override
    public ZhongkaiResult device_switch(final String device_id, final String is_switch, Integer parameter, final String user_uuid) throws Exception {

        if (StringUtils.isNullOrEmpty(device_id)
                || StringUtils.isNullOrEmpty(is_switch)) {
            return ZhongkaiResult.build(400, "数据不完整");
        }


        //1 查询用户是否有此设备的控制权
        //2 有权限 判断设备是否在线
        //3 在线 没有用户控制 发送控制请求 把当前控制者存入缓存
        //4 在线 有用户控制 取出缓存中的控制者  对比权限  当前用户大 控制
        //5 在线 有用户控制 取出缓存中的控制者  对比权限  当前用户小 返回控制者姓名  提示无法控制
        //6 在线 异常 查询用户是否为维修用户 不是 返回设备异常
        //7 在线 异常 查询用户是否为维修用户 是 查询维修用户是否接此设备的维修派单 已接收  控制
        //8 在线 异常 查询用户是否为维修用户 是 查询维修用户是否接此设备的维修派单 未接收  控制失败
        //9 不在线  控制失败


        //判断设备是否在线

        //FsonUser fsonUser;

        // List<FsonUser> list = iBaseDao.find("from FsonUser fu where fu.appUuid='" + chinaset.getUuid() + "'");

/*        if (setUnit.getWarning() == 1){ //设备正常可以控制
            for (FsonUser fsonUser : list) {
                if (fsonUser.getfUid().equals(device_id)) {
                    //此用户有控制权限
                }
            }

            return ZhongkaiResult.build(401, "您无法控制此设备");
        }*/

        ObjectMapper mapper = new ObjectMapper();

        BigDateBean bigDateBean = new BigDateBean();//设备实时数据对象


        final SetUnit setUnit = (SetUnit) iBaseDao.get("from SetUnit su where su.setUuid='" + device_id + "'");

        if (setUnit == null) {

            return ZhongkaiResult.build(401, "设备不存在");
        }

        if ("2".equals(setUnit.getSetRemove())) {  //1未删除  2已删除
            return ZhongkaiResult.build(401, "设备已删除");
        }

        if (setUnit.getSetStatus() == 100) {  //1开机  0关机  100离线
            return ZhongkaiResult.build(401, "设备已离线");

        }


        String json = (String) jedisClient.get(StringStatic.REDIS_UNIT + device_id); //查询缓存

        if (!StringUtils.isNullOrEmpty(json)) { //实时数据存在
            bigUnitBean_json = mapper.readValue(json, BigUnitBean.class);


            if ("1".equals(is_switch) || "2".equals(is_switch)) {

                if ("1".equals(bigUnitBean_json.getSys_stop())) {

                    return ZhongkaiResult.build(402, "设备正在关闭");
                }


                if ("2".equals(bigUnitBean_json.getSys_stop())) {
                    return ZhongkaiResult.build(402, "设备正在执行您的命令 请稍后~");
                }
            }


            switch (bigUnitBean_json.getState()) { //1-6是开机状态
                case "1":
                case "2":
                case "3":
                case "4":
                case "5":
                    if ("1".equals(is_switch)) { //1 开机

                        if ("2".equals(bigUnitBean_json.getSys_stop())) {
                            return ZhongkaiResult.build(402, "压缩机正在转换模式 请稍后...");
                        }

                        return ZhongkaiResult.build(402, "设备已经开启");

                    }

                    break;

                case "6": //不可关机


                    if ("2".equals(is_switch)) { // 关机
                        return ZhongkaiResult.build(402, "设备处于防冻状态 暂时不可关机 请稍后...");
                    }

                    break;

                case "0": //0是关机状态

                    if ("2".equals(is_switch)) { // 关机
                        return ZhongkaiResult.build(4002, "设备已经关闭");
                    }
                    break;
            }

/*            if (is_switch.equals(bigUnitBean_json.getState())) {

                if (is_switch.equals(0)) {
                    return ZhongkaiResult.build(402, "设备已关闭");
                } else {
                    return ZhongkaiResult.build(402, "设备已开启");

                }

            }*/

        } else {

            deviceOperationService.deviceDown2(device_id); //设备下线
            return ZhongkaiResult.build(402, "设备暂时断开连接...");


        }


/*        if (setUnit.getSetStatus() == Integer.getInteger(is_switch)) {
            if ("1".equals(is_switch)) {
                return ZhongkaiResult.build(402, "设备已开启");
            } else if ("2".equals(is_switch)) {
                return ZhongkaiResult.build(402, "设备已关闭");
            }
        }*/


        final UnitControlBean deviceBean = new UnitControlBean();


        if ("1".equals(is_switch)) { //1 开机
            con = "on";
            deviceBean.setUnit_param("null");

        } else if ("2".equals(is_switch)) {  //2 关机
            con = "off";
            deviceBean.setUnit_param("null");

        } else if ("3".equals(is_switch)) {
            con = "T";
            if (parameter == 0) {
                return ZhongkaiResult.build(500, "参数不完整");
            } else if (parameter < 9 || parameter > 46) {
                return ZhongkaiResult.build(500, "参数不合法");
            }
            deviceBean.setUnit_param(String.valueOf(parameter));

        } else {
            return ZhongkaiResult.build(500, "参数不合法");

        }


        if (setUnit.getRepair() == 2) {  //是否维修 1否 2是

            return ZhongkaiResult.build(400, "您无法操作 设备处已处于维修状态!");
        } else {


            //正常或报警
            //查看户主和子用户是否控制
            String tb_json = jedisClient.get("TB_DEVICE:" + device_id);


            if (StringUtils.isNullOrEmpty(tb_json)) {
                //没有控制者  直接控制

                deviceBean.setUnit_uuid(device_id);
                deviceBean.setUnit_ip(bigUnitBean_json.getIp());
                deviceBean.setUnit_control(con);

                byte[] bytes = mapper.writeValueAsString(deviceBean).getBytes("utf-8");
                rocketMqProducer.sendMsgIntime(MessageTool.BIG_SKY, MessageTool.UNIT_CON, bytes);

/*                jmsTemplate.send(topicDestination, new MessageCreator() {


                    @Override
                    public Message createMessage(Session session) throws JMSException {


                        ObjectMapper mapper = new ObjectMapper();

                        StringBuilder stringBuilder = new StringBuilder("UnitControlBean:");


                        // String string = null;
                        try {
                            stringBuilder.append(mapper.writeValueAsString(deviceBean));
                            //   string = ;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        TextMessage textMessage = session.createTextMessage(stringBuilder.toString());
                        return textMessage;
                    }
                });*/

                return ZhongkaiResult.ok();

            } else { //有控制者


                return ZhongkaiResult.build(400, "用户正在操作此设备");
   /*             MasterBean masterBean = null;
                try {
                    masterBean = mapper.readValue(tb_json, MasterBean.class);
                } catch (IOException e) {
                    e.printStackTrace();
                    return ZhongkaiResult.build(400, "用户正在操作此设备");
                }*/
                //return ZhongkaiResult.build(402, masterBean.getMasterName() + "正在操作此设备,手机号为:" + masterBean.getMasterPhone());
            }
        }

    }

/*
    public ZhongkaiResult getUserToken(String token) {
        //Jedis jedis = new Jedis("192.168.25.128", 6379);
        String json = jedisClient.get(token);

        if (StringUtils.isNullOrEmpty(json)) {
            //jedis.close();
            return ZhongkaiResult.build(201, "用户过期,请重新登录");
        } else {


            try {
                Chinaset chinaset;
                ObjectMapper mapper = new ObjectMapper();
                chinaset = mapper.readValue(json, Chinaset.class);
                //  jedisClient.expire(token, 604800);//重新设置过期时间

                return ZhongkaiResult.ok(chinaset);
            } catch (IOException e) {
                e.printStackTrace();
                return ZhongkaiResult.build(201, "查询失败,请重新登录");
            }

        }
    }*/
}
